package main

import (
	"fmt"
)

func main() {
	//var ch chan int //声明式创建管道，nil=true
	var ch = make(chan int, 3)
	fmt.Println(cap(ch), len(ch)) // 3 0
	var ch2 = make(chan int)
	fmt.Println(cap(ch2), len(ch2)) // 0 0
	fmt.Println(ch == nil)          // false

	ch <- 1
	ch <- 2
	ch <- 3
	close(ch)

	//chennel只有在里面的数据全部被取完后，才会是关闭状态，这么设计的目的也许是为了保证消费端能拿到全部的数据
	for {
		data, open := <-ch
		if !open { //管道被真正关闭后还能取出默认的值
			fmt.Println("chennel closed! but i can still get default data", data)
			break
		} else {
			fmt.Println(data)
		}
	}

	//也可以用range方法取出里面的数据，这种方式会自动判断是否关闭
	for data := range ch {
		fmt.Println(data)
	}

}
